package bit_operation;

import org.junit.Test;

/**
 * @Description 剑指 Offer 56 - II. 数组中数字出现的次数 II
 * k神题解里有个自动转换机,那个就别看了
 * @Author Firenut
 * @Date 2023-01-25 21:42
 */
public class T56_II_singleNumber {
    @Test
    public void test() {
        int res=0;
        System.out.println(res << 1);

        singleNumber(new int[]{2, 2, 3, 2});
//        singleNumber(new int[]{3, 4, 3, 3});
    }

    // 法2
    public int singleNumber(int[] nums) {
        int count[] = new int[32];
        for(int num : nums){
            for (int i = count.length - 1; i >= 0; i--) { //count数组从 0~31 对应二进制的高位到低位
                count[i] += num & 1;
                num >>>= 1;
            }
        }
        int res=0;
        for (int i = 0; i < count.length; i++) {
            res <<= 1;
            res |= count[i]%3;
//            假设要复原的数res的二进制最高位为1,先左移得 0,然后进行与运算得到res= 1;

//            res |= count[i]%3;
//            res <<= 1;
            // 换顺序后有问题，假设要复原的数res的二进制最高位为1,先进行与运算再左移就变成 1 0 了(应该偏移1位而实际偏了2位，实际应该是 1 )
            // 也就是多移位了一次，所以看到的结果是正确答案的两倍
        }
        return res;
    }

    // 法1 哈希表 记录key及对应出现的次数value
}